home *** CD-ROM | disk | FTP | other *** search
Java Source | 2000-05-25 | 5.3 KB | 173 lines |
- //: CopyConstructor.java
- //////////////////////////////////////////////////
- // Copyright (c) Bruce Eckel, 1998
- // Source code file from the book "Thinking in Java"
- // All rights reserved EXCEPT as allowed by the
- // following statements: You can freely use this file
- // for your own work (personal or commercial),
- // including modifications and distribution in
- // executable form only. Permission is granted to use
- // this file in classroom situations, including its
- // use in presentation materials, as long as the book
- // "Thinking in Java" is cited as the source.
- // Except in classroom situations, you cannot copy
- // and distribute this code; instead, the sole
- // distribution point is http://www.BruceEckel.com
- // (and official mirror sites) where it is
- // freely available. You cannot remove this
- // copyright and notice. You cannot distribute
- // modified versions of the source code in this
- // package. You cannot use this file in printed
- // media without the express permission of the
- // author. Bruce Eckel makes no representation about
- // the suitability of this software for any purpose.
- // It is provided "as is" without express or implied
- // warranty of any kind, including any implied
- // warranty of merchantability, fitness for a
- // particular purpose or non-infringement. The entire
- // risk as to the quality and performance of the
- // software is with you. Bruce Eckel and the
- // publisher shall not be liable for any damages
- // suffered by you or any third party as a result of
- // using or distributing software. In no event will
- // Bruce Eckel or the publisher be liable for any
- // lost revenue, profit, or data, or for direct,
- // indirect, special, consequential, incidental, or
- // punitive damages, however caused and regardless of
- // the theory of liability, arising out of the use of
- // or inability to use software, even if Bruce Eckel
- // and the publisher have been advised of the
- // possibility of such damages. Should the software
- // prove defective, you assume the cost of all
- // necessary servicing, repair, or correction. If you
- // think you've found an error, please email all
- // modified files with clearly commented changes to:
- // Bruce@EckelObjects.com. (Please use the same
- // address for non-code errors found in the book.)
- /////////////////////////////////////////////////
-
- // A constructor for copying an object
- // of the same type, as an attempt to create
- // a local copy.
-
- class FruitQualities {
- private int weight;
- private int color;
- private int firmness;
- private int ripeness;
- private int smell;
- // etc.
- FruitQualities() { // Default constructor
- // do something meaningful...
- }
- // Other constructors:
- // ...
- // Copy constructor:
- FruitQualities(FruitQualities f) {
- weight = f.weight;
- color = f.color;
- firmness = f.firmness;
- ripeness = f.ripeness;
- smell = f.smell;
- // etc.
- }
- }
-
- class Seed {
- // Members...
- Seed() { /* Default constructor */ }
- Seed(Seed s) { /* Copy constructor */ }
- }
-
- class Fruit {
- private FruitQualities fq;
- private int seeds;
- private Seed[] s;
- Fruit(FruitQualities q, int seedCount) {
- fq = q;
- seeds = seedCount;
- s = new Seed[seeds];
- for(int i = 0; i < seeds; i++)
- s[i] = new Seed();
- }
- // Other constructors:
- // ...
- // Copy constructor:
- Fruit(Fruit f) {
- fq = new FruitQualities(f.fq);
- seeds = f.seeds;
- // Call all Seed copy-constructors:
- for(int i = 0; i < seeds; i++)
- s[i] = new Seed(f.s[i]);
- // Other copy-construction activities...
- }
- // To allow derived constructors (or other
- // methods) to put in different qualities:
- protected void addQualities(FruitQualities q) {
- fq = q;
- }
- protected FruitQualities getQualities() {
- return fq;
- }
- }
-
- class Tomato extends Fruit {
- Tomato() {
- super(new FruitQualities(), 100);
- }
- Tomato(Tomato t) { // Copy-constructor
- super(t); // Upcast for base copy-constructor
- // Other copy-construction activities...
- }
- }
-
- class ZebraQualities extends FruitQualities {
- private int stripedness;
- ZebraQualities() { // Default constructor
- // do something meaningful...
- }
- ZebraQualities(ZebraQualities z) {
- super(z);
- stripedness = z.stripedness;
- }
- }
-
- class GreenZebra extends Tomato {
- GreenZebra() {
- addQualities(new ZebraQualities());
- }
- GreenZebra(GreenZebra g) {
- super(g); // Calls Tomato(Tomato)
- // Restore the right qualities:
- addQualities(new ZebraQualities());
- }
- void evaluate() {
- ZebraQualities zq =
- (ZebraQualities)getQualities();
- // Do something with the qualities
- // ...
- }
- }
-
- public class CopyConstructor {
- public static void ripen(Tomato t) {
- // Use the "copy constructor":
- t = new Tomato(t);
- System.out.println("In ripen, t is a " +
- t.getClass().getName());
- }
- public static void slice(Fruit f) {
- f = new Fruit(f); // Hmmm... will this work?
- System.out.println("In slice, f is a " +
- f.getClass().getName());
- }
- public static void main(String[] args) {
- Tomato tomato = new Tomato();
- ripen(tomato); // OK
- slice(tomato); // OOPS!
- GreenZebra g = new GreenZebra();
- ripen(g); // OOPS!
- slice(g); // OOPS!
- g.evaluate();
- }
- } ///:~